package com.jake.summer.framework.util;

import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

@Slf4j
public final class SummerReflectionUtils {

    /**
     * @param cls Class 类型的对象
     * @return 返回根据 Class 类型的对象创建的实例
     */
    public static Object newInstance(Class<?> cls) {
        Object instance;
        try {
            instance = cls.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            log.error("创建类的实例失败", e);
            throw new RuntimeException(e);
        }
        return instance;
    }

    /**
     * 利用反射机制调用方法
     * @param obj 需要被反射的 bean 对象
     * @param method 需要被调用的方法对象
     * @param args 方法的参数数组
     * @return 方法被调用后的返回值
     */
    public static Object invokeMethod(Object obj, Method method, Object... args) {
        Object result;
        try {
            method.setAccessible(true); // 去除私有权限
            result = method.invoke(obj, args);
        } catch (IllegalAccessException | InvocationTargetException e) {
            log.error("反射调用方法失败", e);
            throw new RuntimeException(e);
        }
        return result;
    }

    /**
     * 利用反射机制设置字段值
     * @param obj 需要被反射的 bean 对象
     * @param field 需要被设置值的字段对象
     * @param value 设置给字段的值
     */
    public static void setField(Object obj, Field field, Object value) {
        try {
            field.setAccessible(true); // 去除私有权限
            field.set(obj, value);
        } catch (IllegalAccessException e) {
            log.error("反射设置字段值失败", e);
            throw new RuntimeException(e);
        }
    }
}
